
        <html>
			<head>
			     <title>逆向浅析常见病毒的注入方式系列之一-----WriteProcessMemory - 胡一米</title>
				 <meta http-equiv="content-type" content="text/html; charset=UTF-8">
			</head>
			<body>
				<h1>原文地址:<a href="http://drops.wooyun.org/tips/16614">http://drops.wooyun.org/tips/16614</a></h1>
				
      <p>
        <p><strong>Author：卫士通攻防实验室(<a class="__cf_email__" href="/cdn-cgi/l/email-protection" data-cfemail="7e3f3a321f1c3e091b0d0a11101b501d1113501d10">[email&#160;protected]</a><script data-cfhash='f9e31' type="text/javascript">/* <![CDATA[ */!function(t,e,r,n,c,a,p){try{t=document.currentScript||function(){for(t=document.getElementsByTagName('script'),e=t.length;e--;)if(t[e].getAttribute('data-cfhash'))return t[e]}();if(t&&(c=t.previousSibling)){p=t.parentNode;if(a=c.getAttribute('data-cfemail')){for(e='',r='0x'+a.substr(0,2)|0,n=2;a.length-n;n+=2)e+='%'+('0'+('0x'+a.substr(n,2)^r).toString(16)).slice(-2);p.replaceChild(document.createTextNode(decodeURIComponent(e)),c)}p.removeChild(t)}}catch(u){}}()/* ]]> */</script>)</strong></p>

<h1>0x00 引言</h1>

<hr />

<p>顾名思义，注入这种技术就是将代码或DLL注入到另外一个正在运行的进程中，以实现隐藏自身或其他目的。常见病毒根据其需求会选择不同的注入方式，但每种注入方式都是值得我们了解和学习的。本系列文章打算把常见病毒的注入方式分门别类地进行汇总，在每个类别中选择一个有代表性的病毒，逆向分析该病毒的注入方式，并展示给各位读者，以供大家学习和参考。</p>

<p>作为本系列的第一篇，笔者将介绍利用WriteProcessMemory()函数进行的DLL注入。作为该类注入方式的代表DesktopLayer.exe也很具有分析价值，下面开始进入正文。此外，笔者忠心希望本系列能给读者一点启发和帮助，但由于笔者知识有限，才疏学浅，文中不当或错误之处还请各位读者包容和指正。</p>

<ul>
<li>分析工具：IDA，OD，CFF等。</li>
<li>分析环境：Win7 x86 Vmware</li>
<li>样本地址：百度能搜到一堆，实在弄不到，再联系笔者吧。</li>
</ul>

<!--more-->

<h1>0x01 样本概况</h1>

<hr />

<table>
  <tr>
    <td>
      Name
    </td>
    
    <td>
      DesktopLayer.exe
    </td>
  </tr>
  
  <tr>
    <td>
      Size
    </td>
    
    <td>
      55.00 KB (56320 bytes)
    </td>
  </tr>
  
  <tr>
    <td>
      MD5
    </td>
    
    <td>
      FF5E1F27193CE51EEC318714EF038BEF
    </td>
  </tr>
</table>

<p>该病毒是近一两年出现的，功能全面，结构合理，是个不错的分析和学习对象。为了让读者更顺利的进行分析和学习，笔者在2.1-2.3节逆向分析介绍了实现注入之前的代码功能，如果对这部分不感兴趣或是不打算逆向这个样本，可以直接跳到2.4节。</p>

<h1>0x02 详情分析</h1>

<hr />

<h2>一、 脱壳</h2>

<h3>A. 一层脱壳</h3>

<p>样本被加了UPX 2.90壳。UPX壳最主要的目的是减小程序的体积，其特点是较高的压缩率和较快的解压速率，与TMD、VMP这类壳的设计理念完全不同，这类壳更注重对代码提供保护的壳。UPX是免费软件，其官网上可以找到每个UPX版本的加壳程序和相应脱壳程序，网址为http://upx.sourceforge.net/。这里笔者也懒得去网上翻了，直接手动脱壳就可以了，其脱壳后的入口点模样如下：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314095035473138.png" alt="pic1" /></p>

<h3>B. 二层脱壳</h3>

<p>脱壳之后的样本仍然压缩了大量的代码，深入分析之后，可以判断为是变形UPX壳。由于UPX是开源的，所以很多同行会根据需要修改UPX的源代码。该变型壳首先解码UPX解码部分的代码，然后利用UPX的解码代码再次解码恶意功能的代码。其中，第一次解码完成后，会跳入该地址继续执行，该地址与3.1.1节所述的UPX代码基本相同，等完成其解码之后，可以再次Dump，其最终的入口点如下：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314095272959220.png" alt="pic2" /></p>

<p>经过二层脱壳之后，会发现样本的图标已经改变：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314095473455318.png" alt="pic3" /></p>

<p>图中左侧为原始图标，右侧为完全脱壳之后的图标。</p>

<h2>二、 第一次执行分析</h2>

<p>当正确地脱掉两层壳之后，就会看到这段程序原本的模样：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314095545972417.png" alt="pic4" /></p>

<p>下面开始着重分析其功能，首先是获取测试机的默认浏览器及其位置，其获取方式是查找注册表中，<code>HKCR\http\shell\open\command</code>的键值：</p>

<p><img src="http://static.wooyun.org//drops/20160613/201606131409571231059.png" alt="pic5" /></p>

<p>在笔者分析机中，该值为：</p>

<p><img src="http://static.wooyun.org//drops/20160613/201606131409591557168.png" alt="pic6" /></p>

<p>即默认的IE浏览器，位置为C:\Program Files\InternetExplorer\iexplore.exe。而后会通过FindFirstFile()函数判断是否存在该文件，即iexplore.exe：</p>

<p><img src="http://static.wooyun.org//drops/20160613/201606131410005889177.png" alt="pic7" /></p>

<p>如果不存在，那么会在几个默认位置进行查找：</p>

<p><img src="http://static.wooyun.org//drops/20160613/201606131410027487688.png" alt="pic8" /></p>

<p>如果存在，则继续后续操作。接下来会创建互斥体。进而，会通过GetModuleFileName()函数获取自身执行体所在位置和文件名：</p>

<p><img src="http://static.wooyun.org//drops/20160613/201606131410039935098.png" alt="pic9" /></p>

<p>进而会将自身执行体的文件名与DesktopLayer.exe比较：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314100557475107.png" alt="pic10" /></p>

<p>由于笔者获取到的样本名字是dnf_srv.exe，显然与之不同。那么，样本会以此判断以下7个目录是否可以有读写权限：</p>

<ol>
<li>%ProgramFiles%</li>
<li>%CommonProgramFiles%</li>
<li>%HOMEDRIVE%%HOMEPATH%</li>
<li>%APPDATA%</li>
<li>SystemDirectory</li>
<li>WindowsDirectory</li>
<li>TempPath</li>
</ol>

<p>当找到第一个有权限的目录是，在该文件夹下创建名为Mirosoft的文件夹。在笔者的测试机中，%HOMEDRIVE%%HOMEPATH%是有相应权限的，即会在C:\Users\zzz目录下，创建Microsoft文件夹。并将dnf_srv.exe重命名为DesktopLayer.exe，并复制到C:\Users\zzz\Microsoft文件夹下：</p>

<p><img src="http://static.wooyun.org//drops/20160613/20160613141007608261112.png" alt="pic11" /></p>

<p><img src="http://static.wooyun.org//drops/20160613/20160613141008418621210.png" alt="pic12" /></p>

<p>此后，调用CreateProcess()创建该进程：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314101083255139.png" alt="pic13" /></p>

<p>创建该进程之后，程序就调用ExitProcess()退出了。</p>

<h2>三、 第二次执行分析</h2>

<p>此次执行一直到比较执行体名称的位置之前，都没有任何变化。而与DesktopLayer.exe比较之后，出现了不同行为。首先是，对ntdll.dll中的ZwWriteVirtualMemory()进行hook操作：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314101174706147.png" alt="pic14" /></p>

<p>其操作结果为：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314101356341157.png" alt="pic15" /></p>

<p>而后，会调用CreateProcess函数，启动iexplore.exe进程，该进程的执行体所在位置已于上文中通过查询注册表方式找到：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314101492299165.png" alt="pic16" /></p>

<p>Createprocess()函数内部会调用ZwWriteVirtualMemory()函数，从而执行其经过hook的代码，其调用栈如下：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314101674616175.png" alt="pic17" /></p>

<p>其中，sub_402A59即为其HookCode.</p>

<h2>四、 HookCode执行分析</h2>

<p>HookCode首先完成其正常的WriteVirtualMemory()函数功能：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314101759835185.png" alt="pic18" /></p>

<p>进而，通过ReadProcessMemory()函数获取iexplore.exe进程的内存信息：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314101995630194.png" alt="pic19" /></p>

<p>根据读取到的内存，可以找到后续对iexplore.exe的hook点。</p>

<p>然后，在自身进程内，解码出rmnsoft.dll，手动加载，并根据导入表和重定位表进行相应的操作，最后修改页保护等操作：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314102021309204.png" alt="pic20" /></p>

<p>当在本地加载完之后，就会把rmnsoft.dll注入到iexplore.exe，这需要分6步进行：</p>

<p>第一步，将DLL写入iexplore.exe：</p>

<p><img src="http://static.wooyun.org//drops/20160613/20160613141022368602110.png" alt="pic21" /></p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314102341455223.png" alt="pic22" /></p>

<p>特别强调的是，在iexplore.exe中申请的内存位置和本进程申请内存的位置是一样的，这样做的好处是：避免了在iexplore.exe的重定位操作，大大减小了代码的复杂度。在笔者的测试机中，其基地址同为0x20010000，如图：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314102528647233.png" alt="pic23" /></p>

<p>第二步，将初始化导入表代码写入iexplorer.exe：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314102627857243.png" alt="pic24" /></p>

<p>这里需要指出的是，代码内容主要为对PE头的进行操作的PIC代码。</p>

<p>第三步，将修改页保护相关代码写入iexplorer.exe。</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314102840829253.png" alt="pic25" /></p>

<p>该段代码的作用是通过PE头得到各个区段的页保护属性，同样是PIC代码。</p>

<p>第四步，将修复代码写入iexplorer.exe。</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314102999593263.png" alt="pic26" /></p>

<p>该段代码会调用第1步、第2步、第3步写入的代码。在第5步中，会执行此步骤中的代码。</p>

<p>第五步，将相关数据写入iexplorer.exe。</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314103154212273.png" alt="pic27" /></p>

<p>第六步，在刚刚找到的hook点写入shellcode，寻找hook点的相关内容见上文：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314103342265283.png" alt="pic28" /></p>

<p>其中，shellcode内容为：BF 00 00 07 00 68 00 00 08 00 FF D7，长度为0xC。</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314103441215292.png" alt="pic29" /></p>

<p>0x70000和0x80000分别为第3步写入的代码基址和第4步写入的数据基址。等程序运行到hook点时，会执行shellcode，从而跳到0x70000地址即第3步写入的代码继续执行进行相关操作。</p>

<p>至此，完整的注入过程和方法已经分析完毕。如果对这部分不是很理解，建议阅读和学习《程序员的自我修养》一书，该书中满满的全是干货。</p>

<p>下面看一下iexplore.exe的执行效果如何：</p>

<p>执行shellcode：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314103679433302.png" alt="pic30" /></p>

<p>然后初始化导入表：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314103794446319.png" alt="pic31" /></p>

<p>然后，分段判断并修改代码的页保护：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314103992033323.png" alt="pic32" /></p>

<p>最后，调用DLL main：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314104072061332.png" alt="pic33" /></p>

<p>此后，该恶意DLL会开始他的行为。</p>

<h2>五、rmnsoft.dll分析</h2>

<p>该DLL可以在其加载之前dump出来，这里就不做演示了。此外，该DLL并未有混淆或者加壳等措施，逆向起来比较轻松，这里就不做详细分析，只做简要介绍：</p>

<p><img src="http://static.wooyun.org//drops/20160613/2016061314104296094342.png" alt="pic34" /></p>

<p>如上图，DLL会创建5个线程，其中每个线程会实现其相应的恶意功能。</p>

<h1>0x03 总结</h1>

<hr />

<p>本文以病毒DesktopLayer.exe为样本，着重介绍了利用WriteProcessMemory()函数进行DLL注入的方法，简而言之，可以认为程序直接将所有相关的代码和数据直接写到被注入的进程空间中。其注入的DLL只在内存中出现，并未在硬盘中出现过。这种注入方式需要对PE结构有较好的理解，且对DLL装载过程有很好的理解，建议不熟悉这部分内容的读者可以阅读和学习《程序员的自我修养》，以进一步获得提高。</p>

<p>本系列会陆续介绍其他常见病毒的注入方式，希望各位读者能够有所收获。</p>      </p>
    
			</body>
		</html>
                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                          